#include "Funcion.h"

Funcion::Funcion() { }

Funcion::Funcion(string nombre, string nombreArchivo) {
    this->_nombre = nombre;
    this->_nombreArchivo = nombreArchivo;
}

void Funcion::evaluar(CasoDeTest& casoDeTest) {
    // invocar a la funcion y guardar el res en casoDeTest

    vector<TipoDeDato*>& parametros = casoDeTest.getParametros();

    bool esValido = chequearParametros(parametros);

    if(!esValido){
		cout << "No pasa el chequeo de tipo" << endl;
        return;
    }

    // !!NO MODIFICAR LA SIGUIENTE LINEA!!
    /* aca va la funcion a evaluar */

}

void Funcion::agregarParametro(Parametro parametro) {
    this->_parametros.push_back(parametro);
}

string Funcion::getNombre() {
    return _nombre;
}

string Funcion::getNombreArchivo() {
    return _nombreArchivo;
}

void Funcion::setNombre(string nombre) {
    this->_nombre = nombre;
}

void Funcion::setNombreArchivo(string nombreArchivo) {
    this->_nombreArchivo = nombreArchivo;
}

int Funcion::getCantParametros() {
    return _parametros.size();
}

vector<Parametro>& Funcion::getParametros(){
    return _parametros;
}

bool Funcion::chequearParametros(vector<TipoDeDato*>& parametros){
    if(parametros.size() != this->_parametros.size()){
        return false;
    } else {
        vector<TipoDeDato*>::iterator iter;
        vector<Parametro>::iterator iter2;
        iter2 = _parametros.begin();
int i = 0;
        for( iter = parametros.begin(); iter != parametros.end(); iter++ ) {
            TipoDeDato* td   = *iter;
            Parametro p     = *iter2;

            if(td->getClass() != p.getClaseDeDato()){
cout << td->getClass() << endl;
cout << p.getClaseDeDato() << endl;
cout << "indice " << i << endl;
                return false;
            }

            iter2++;
i++;
        }

        return true;
    }
}

void Funcion::setParametroSalida(Parametro parametro) {
    this->_parametroSalida = parametro;
}

Parametro Funcion::getParametroSalida() {
    return this->_parametroSalida;
}
